package com.powernode.service.impl;

import com.powernode.constant.Constants;
import com.powernode.entity.Goods;
import com.powernode.service.GoodsService;
import jakarta.annotation.Resource;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 * 商品服务实现类
 * 提供商品相关的业务逻辑实现，包括从Redis查询商品列表和根据ID查询商品详情
 */
@Service
public class GoodsServiceImpl implements GoodsService {
    @Resource
    private RedisTemplate redisTemplate;

    /**
     * 从Redis中查询所有商品列表
     * 该方法通过扫描Redis中特定前缀的key来获取所有商品信息，适用于商品列表展示场景
     * @return 包含所有商品信息的List集合
     */
    @Override
    public List<Goods> queryGoodsList() {
        List<Goods> goodsList = new ArrayList<>();

        // 从Redis中查询所有以Constants.REDIS_GOODS为前缀的key
        // Constants.REDIS_GOODS通常定义为"goods:"，因此实际匹配的key格式为"goods:1", "goods:2"等
        Set<String> keys = redisTemplate.keys(Constants.REDIS_GOODS + "*");

        // 遍历所有匹配的key，根据key查询商品信息并添加到列表中
        keys.forEach(goodsKey -> {
            // 通过RedisTemplate的opsForValue().get()方法获取商品信息
            // 注意：此处没有进行类型转换的异常处理，假设Redis中存储的都是Goods类型的对象
            Goods goods = (Goods) redisTemplate.opsForValue().get(goodsKey);
            goodsList.add(goods);
        });

        return goodsList;
    }


    /**
     * 根据商品ID从Redis中查询商品详情
     * 该方法直接通过商品ID构建Redis的key，实现快速查询，适用于商品详情页展示
     * @param id 商品ID
     * @return 对应的商品信息，如果Redis中不存在则返回null
     */
    @Override
    public Goods queryGoodsById(Integer id) {
        // 构建完整的Redis key，格式为"goods:{id}"
        // 例如：当id=1001时，key为"goods:1001"
        Goods goods = (Goods)redisTemplate.opsForValue().get(Constants.REDIS_GOODS + id);
        return goods;
    }
}
